<?php
/**
 * > 記事表示コントローラ
 *
 * LICENSE: Miracle Maple by Mirage is licensed
 * under a Creative Commons 表示-非営利-継承 2.1 日本 License.
 *
 * @category   article
 * @package    maple-story.jp
 * @version    8.0.0
 * @link       http://maple-story.jp/article/
 * @since      File available since Release 8.0.0
 * @copyright  Copyright 2011 Miracle Maple
 * @license    http://creativecommons.org/licenses/by-nc-sa/2.1/jp/     Creative Commons BY-NC-SA
 */
class ArticleController extends Zend_Controller_Action
{
    /**
     * 記事 (トップ)
     */
    public function indexAction()
    {
        return $this->_forward('content', 'article', 'default', array('name' => 'about'));
    }
    
    /**
     * 記事 (一覧)
     */
    public function searchAction()
    {
        // パラメータ
        $group = $this->_getParam('group');
        if (empty($group)) {
			throw new Exception('記事グループコードがありません。');
        }

        // 記事
        $options = array('cache' => $group,
                         'groupCd' => $group
                        );
        $articles = $this->_getArticles($options);
        if ($articles === false) {
			throw new Exception('該当する記事がありません。');
        }
        
		// ビュー設定
        $articleGroup = $this->_getArticleGroup($group);
        $this->view->groupName = $articleGroup->name;
        $this->view->entry = $articles;
		$this->view->topicPath = $this->_getTopicPathList($articles);		

		// 記事ヘッダ
		$this->view->headTitle($articleGroup->name, 'PREPEND');
		$this->view->headMeta()->appendName('keywords', Zend_Registry::get('DEFAULT_KEYWORDS'));
		$this->view->headMeta()->appendName('description', Zend_Registry::get('DEFAULT_DESCRIPTION'));	
    }
    
    /**
     * 記事 (名前検索)
     *
     * name パラメータから記事を検索して取得します。
     * また、取得した記事と同じグループの記事を全て取得します。
     */
     public function contentAction()
    {
        // パラメータ
        $articleName = $this->_getParam('subject');
        if (empty($articleName)) {
            throw new Zend_Controller_Action_Exception('Article name is not provided.');
        }

        // 記事
        $options = array('cache' => md5($articleName),
                         'subject' => urldecode($articleName)
                        );
        $articles = $this->_getArticles($options);
        if ($articles === false) {
            throw new Zend_Controller_Action_Exception('Article is not found.');
		}
		$article = $articles[0];

		// 関連記事表示
        if ($article->isolate_flg == 1) {
            $relatedArticles = false;
        } else {
            $options = array('cache' => $articleName . 'Related',
                             'groupCd' => $article->group_cd,
                             'exceptId' => $article->id             // 自記事を除く
                            );
            $relatedArticles = $this->_getArticles($options);
            
            if ($relatedArticles !== false) {
                shuffle($relatedArticles);
            }
        }
		
		// ビュー設定
		$this->_setArticleHeader($article);
        $this->view->entry = $article;
        $this->view->related = $relatedArticles;
		$this->view->topicPath = $this->_getTopicPathContent($article);
		
		// 正規化 URL (設定された URL が実 URL と異なる場合)
		$canonicalUrl = 'http://' . HOST_PRODUCTION . $article->canonical_url;
		if (!empty($article->canonical_url)
		    && $this->getRequest()->getRequestUri() != $article->canonical_url) {
			$this->view->headLink(array('rel' => 'canonical',
										'href' => $canonicalUrl),
										'PREPEND');
		}
    }
    
    /**
     * 記事取得
     *
     * 条件を元に記事を検索します。
     * 検索結果はキャッシュに保存します。
     * @param array $option オプション
     *    cache  =>   string  キャッシュ名
     *    call   =>   string  記事名
     *    groupCd  => int     グループコード
     *    exceptId => int     除外記事 ID
     * @return Zend_Db_Rowset 結果行セット
     */
    private function _getArticles($options)
    {
        // データを取得
        $articles = new Model_TrnArticles();
        $rowset = $articles->getArticles($options);

        // データが無ければエラー
        if (empty($rowset)) {
            return false;
        }

        return $rowset;
    }
    
    /**
     * 記事カテゴリマスタ取得
     *
     * @return array  記事カテゴリマスタ
     */
    private function _getArticleGroup($cd)
    {
        $articleGroup = new Model_MstArticleGroup();
        return $articleGroup->find($cd);
    }
	
	private function _getTopicPathContent($article)
	{
        $topicPath = array();
	
		if ($article->isolate_flg != true) {
			$articleGroup = $this->_getArticleGroup($article->group_cd);
			$topicPath[] = array('url' => '/article/search/group/' . $article->group_cd,
								 'name' => $articleGroup->name);
		}
		$topicPath[] = array('name' => $article->subject);	
        return $topicPath;	
	}
	
	private function _getTopicPathList($articles)
	{
        $topicPath = array();
		$article = $articles[0];
		$articleGroup = $this->_getArticleGroup($article->group_cd);
		$topicPath[] = array('name' => $articleGroup->name);
		
        return $topicPath;	
	}
	
	private function _setArticleHeader($article)
	{
		if ($article->meta_keyword !== null) {
			$keyword = $article->meta_keyword . ',' . Zend_Registry::get('DEFAULT_KEYWORDS');
		} else {
			$keyword = Zend_Registry::get('DEFAULT_KEYWORDS');
		}            
		
		if ($article->meta_description !== null) {
			$description = $article->meta_description;
		} else {
			$description = Zend_Registry::get('DEFAULT_DESCRIPTION');
		}
        
		$this->view->headTitle($article->subject, 'PREPEND');
		$this->view->headMeta()->appendName('keywords', $keyword);
		$this->view->headMeta()->appendName('description', $description);
	}
}
